package acadclockmidletpkg;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.DateField;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.*;
import javax.microedition.rms.RecordStore;

/**
 * Отображает текущее время, дату, день недели, а также номер недели в семестре
 * и её характеристики: числитель/знаменатель, первый/второй.
 *
 * @author Kolomoets G.P.
 * @version 1.0
 */
public class MainMIDlet extends MIDlet implements CommandListener {

    //Объект, инкапсулирующий методы работы с базой данных
    private static RMSWorker worker;
    //Команды
    private Command exitMiidlet;
    private Command openSettingsForm;
    private Command saveSettingsForm;
    //Команда выхода из настроек без сохранения и перехода к главному экрану
    private Command cancelSettingsForm;
    //Команда очистки базы данных
    private Command cleanDBCommand;
    //Экраны
    //Объект-главный экран с данными о дате и времни
    private MainScreen mainScreen;
    //Форма и элементы экрана настроек
    private SettingsScreen settingsForm;
    //Дисплей
    private Display myDisplay;

    /**
     * Конструктор - создание команд и объектов работы с БД и главного экрана.
     */
    public MainMIDlet() {
        this.exitMiidlet = new Command("Выход", Command.EXIT, 0);
        this.openSettingsForm = new Command("Настройки", Command.SCREEN, 0);
        this.saveSettingsForm = new Command("Сохранить", Command.OK, 0);
        this.cancelSettingsForm = new Command("Отмена", Command.BACK, 0);
        this.cleanDBCommand = new Command("Очистить", Command.SCREEN, 0);
        MainMIDlet.worker = new RMSWorker();
        /*Инициализация хранилища записей*/
        worker.initializeRecordStore();
        /*Инициализация главного экрана*/
        this.mainScreen = new MainScreen();
        myDisplay = Display.getDisplay(this);
    }

    /**
     * @return the worker
     */
    public static RMSWorker getWorker() {
        return worker;
    }

    public void startApp() {
        mainScreen.addCommand(exitMiidlet);
        mainScreen.addCommand(openSettingsForm);
        mainScreen.setCommandListener(this);
        myDisplay.setCurrent(mainScreen);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

    /**
     * Обработчик команд.
     *
     * @param c кодманда
     * @param d объект Displayable (либо главный экран, либо форма настроеек)
     */
    public void commandAction(Command c, Displayable d) {
        if (d == mainScreen) {
            if (c == exitMiidlet) {
                destroyApp(false);
                notifyDestroyed();
            } else if (c == openSettingsForm) {
                buildSettingsForm();
                /*Считывание текщих данных полей для формы настроеек*/
                AcademicClockRecord record = RMSWorker.record;
                //TODO попробовать заменить сеттеры в SettingsScreen чтобы упростить ниже
                DateField fsb=record.getFirstSemesterBegin();
                System.out.println("First semester begin at " + fsb.getDate().getTime());
                settingsForm.setFirstSemesterBegin(fsb);
                DateField ssb=record.getSecondSemesterBegin();
                System.out.println("Second semester begin at " + ssb.getDate().getTime());
                settingsForm.setSecondSemesterBegin(record.getSecondSemesterBegin());
                System.out.println("Pair Duration is " + record.getPairDuration().getString());
                settingsForm.setPairDuration(record.getPairDuration());
                settingsForm.setFirstPairBegin(record.getFirstPairBegin());
                settingsForm.setSecondPairBegin(record.getSecondPairBegin());
                settingsForm.setThirdPairBegin(record.getThirdPairBegin());
                settingsForm.setFourthPairBegin((record.getFourthPairBegin()));
                settingsForm.setFifthPairBegin((record.getFifthPairBegin()));
                settingsForm.setSixthPairBegin((record.getSixthPairBegin()));
                settingsForm.setSeventhPairBegin((record.getSeventhPairBegin()));
                settingsForm.setEighthPairBegin((record.getEighthPairBegin()));
                settingsForm.setNinethPairBegin((record.getNinethPairBegin()));
                myDisplay.setCurrent(settingsForm);
            }
        } else if (d == settingsForm) {
            if (c == saveSettingsForm) {
                /*Обновление значений полей формы настроек*/
                AcademicClockRecord tmpRecord = new AcademicClockRecord() ;
                DateField fsb=settingsForm.firstSemesterBegin;
                tmpRecord.setFirstSemesterBegin(fsb);
                System.out.println("First semester begin at " + fsb.getDate().getTime());
                DateField ssb=settingsForm.secondSemesterBegin;
                tmpRecord.setSecondSemesterBegin(ssb);
                System.out.println("Second semester begin at " + ssb.getDate().getTime());
                TextField pd=settingsForm.getPairDuration();
                tmpRecord.setPairDuration(pd);
                System.out.println("Pair Duration ist " + pd.getString());
                tmpRecord.setFirstPairBegin(settingsForm.getFirstPairBegin());
                tmpRecord.setSecondPairBegin(settingsForm.getSecondPairBegin());
                tmpRecord.setThirdPairBegin(settingsForm.getThirdPairBegin());
                tmpRecord.setFourthPairBegin(settingsForm.getFourthPairBegin());
                tmpRecord.setFifthPairBegin(settingsForm.getFifthPairBegin());
                tmpRecord.setSixthPairBegin(settingsForm.getSixthPairBegin());
                tmpRecord.setSeventhPairBegin(settingsForm.getSeventhPairBegin());
                tmpRecord.setEighthPairBegin(settingsForm.getEighthPairBegin());
                tmpRecord.setNinethPairBegin(settingsForm.getNinethPairBegin());
                getWorker().updateRecord(1, tmpRecord);
                RMSWorker.record=tmpRecord;
                myDisplay.setCurrent(mainScreen);
            } else if (c == cancelSettingsForm) {
                myDisplay.setCurrent(mainScreen);
            } else if (c == cleanDBCommand) {
                cleanDB();
                destroyApp(false);
                notifyDestroyed();
            }
        }
    }

    /**
     * Построение формы настроек.
     */
    private void buildSettingsForm() {
        this.settingsForm = new SettingsScreen("Настройки");
        settingsForm.addCommand(saveSettingsForm);
        settingsForm.addCommand(cancelSettingsForm);
        settingsForm.addCommand(cleanDBCommand);
        settingsForm.setCommandListener(this);
    }

    /**
     * Удвление хранилища базы данных.
     */
    private void cleanDB() {
        if (RecordStore.listRecordStores() != null) {
            try {
                worker.closeRecordStore();
                RecordStore.deleteRecordStore(worker.nameDB);
                myDisplay.setCurrent(mainScreen);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        myDisplay.setCurrent(mainScreen);
    }
}
